package com.insight.modules.system.service.impl;

import lombok.extern.slf4j.Slf4j;
import com.insight.common.exception.JeecgBootException;
import com.insight.common.system.api.ISysJobService;
import com.insight.modules.quartz.job.EquipmentJob;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
@Slf4j
public class ISysJobServiceImpl implements ISysJobService {

    @Autowired
    private Scheduler scheduler; // Quartz调度器，负责管理所有定时任务

    /**
     * 启动一个定时任务
     *
     * @param triggerKey    任务触发器的唯一标识
     * @param groupId       任务分组标识
     * @param cronExpression cron表达式，定义任务执行的时间规则
     * @param variables     任务执行时传递的参数
     */
    @Override
    public void startJob(String triggerKey, String groupId, String cronExpression, Map<String, Object> variables) {
        startJobMethod(triggerKey, groupId, cronExpression, variables);
    }

    /**
     * 创建并启动一个定时任务的具体实现方法
     */
    private void startJobMethod(String triggerKey, String groupId, String cronExpression, Map<String, Object> variables) {
        try {
            // 将传入参数放入JobDataMap，方便任务执行时获取
            JobDataMap newJobDataMap = new JobDataMap();
            newJobDataMap.putAll(variables);

            // 创建一个JobDetail，指定具体执行的Job类和身份标识
            JobDetail job = JobBuilder.newJob(EquipmentJob.class)
                    .usingJobData(newJobDataMap)
                    .withIdentity(triggerKey, groupId)
                    .build();

            // 创建一个Trigger，设置触发时间规则（cron表达式）
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(triggerKey, groupId)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
                    .build();

            // 把Job和Trigger注册到调度器，并启动
            scheduler.scheduleJob(job, trigger);

        } catch (SchedulerException e) {
            // 出错时打印异常日志
            e.printStackTrace();
        }
    }

    /**
     * 删除指定的定时任务
     *
     * @param triggerKey 任务触发器标识
     * @param groupId    任务分组标识
     */
    @Override
    public void removeJob(String triggerKey, String groupId) {
        removeJobMethod(triggerKey, groupId);
    }

    /**
     * 删除定时任务的具体实现：暂停触发器，取消调度，删除任务
     */
    private void removeJobMethod(String triggerKey, String groupId) {
        //移除定时任务
        try {
            scheduler.pauseTrigger(TriggerKey.triggerKey(triggerKey, groupId));
            scheduler.unscheduleJob(TriggerKey.triggerKey(triggerKey, groupId));
            scheduler.deleteJob(JobKey.jobKey(triggerKey, groupId));
        } catch (SchedulerException e) {
            throw new JeecgBootException("删除定时任务失败");
        }
    }

    /**
     * 重启定时任务，先删除再重新创建
     */
    @Override
    public void restartJob(String triggerKey, String groupId, String cronExpression, Map<String, Object> variables) {
        removeJobMethod(triggerKey, groupId);
        startJobMethod(triggerKey, groupId, cronExpression, variables);
    }

    /**
     * 暂停任务触发器，停止任务执行
     */
    @Override
    public void pauseTrigger(String triggerKey, String groupId) {
        try {
            scheduler.pauseTrigger(TriggerKey.triggerKey(triggerKey, groupId));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    /**
     * 恢复暂停的任务触发器，使任务继续执行
     */
    @Override
    public void resumeTrigger(String triggerKey, String groupId) {
        try {
            scheduler.resumeTrigger(TriggerKey.triggerKey(triggerKey, groupId));
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

